package learning

import (
	"fmt"
	"reflect"
)

// 反射示例结构体
type DemoStruct struct {
	Field1 int
	Field2 string
}

// 结构体方法
func (d *DemoStruct) Method1() {
	fmt.Println("Method1 called")
}

func (d *DemoStruct) Method2(param string) {
	fmt.Println("Method2 called with param:", param)
}

// ReflectDemo 反射示例函数
func ReflectDemo() {
	// 创建结构体实例
	demo := &DemoStruct{10, "Hello"}

	// 获取反射值对象
	val := reflect.ValueOf(demo)

	// 获取类型信息
	typ := val.Type()
	fmt.Println("Type:", typ)

	// 遍历结构体字段
	fmt.Println("Fields:")
	for i := 0; i < val.Elem().NumField(); i++ {
		field := typ.Elem().Field(i)
		value := val.Elem().Field(i)
		fmt.Printf("  %s: %v\n", field.Name, value.Interface())
	}

	// 遍历结构体方法
	fmt.Println("Methods:")
	for i := 0; i < val.NumMethod(); i++ {
		method := typ.Method(i)
		fmt.Printf("  %s\n", method.Name)
	}

	// 动态调用方法
	method1 := val.MethodByName("Method1")
	method1.Call(nil) // 无参数调用

	method2 := val.MethodByName("Method2")
	args := []reflect.Value{reflect.ValueOf("world")}
	method2.Call(args)
}
